【CS61B】Lec21 Priority Queue & Heaps

  • 699 字
  1. 1. Lec21 Priority Queue & Heaps
    1. 1.1. 堆
      1. 1.1.1. 定义
      2. 1.1.2. 添加元素
      3. 1.1.3. 删除元素
      4. 1.1.4. 实现方法
      5. 1.1.5. 优先队列的接口
      6. 1.1.6. 时间复杂度

Lec21 Priority Queue & Heaps

堆

定义

若我们使用BST,处理相同元素时会变得很棘手,故我们需要引入堆这种数据结构

堆(二叉最小堆)是一颗完全二叉树,并且它遵循最小堆原则:

  • 每个节点的值都不大于它两个子节点的键值

添加元素

add1

首先将待添加元素加入堆底

add2

然后将该节点与父节点比较,按照结果如果小于父节点则上浮,直到合适位置

删除元素

首先去除根节点,选择堆尾部节点,与期父节点比较,若满足更小性质就将节点上移

del

实现方法

我们将键存在一个数组中,而不需要存储树结构

这只适用于完全二叉树,因为只有完全二叉树可以实现从左往右依次标号得到键列表的结果

为了方便操作,我们将0下标空出来,这样对于节点k,计算父亲与孩子节点就更方便了:

  • 左孩子 =
  • 右孩子 =
  • 父亲 =

对于上浮,使用递归操作,只需要比较当前节点与父节点大小,若父节点更大就需要交换并上浮

1
2
3
4
5
6
public void swim(int k){
if (keys[parent(k)]>keys[k]){
swap(k, parent(k));
swim(parent(k));
}
}

优先队列的接口

可以用 于获取最小/最大/最佳元素

pq

时间复杂度

赞助喵
非常感谢您的喜欢!
赞助喵